"""
面向对象编程（object-oriented programming，OOP）是一种编程范式，是最有效的软件编写方法之一。
在面向对象编程中，我们编写表示现实世界中的事物和情景的类（class），并基于这些类来创建对象（object）。
编写类时，你定义一大类对象都有的通用行为。基于类创建对象时，每个对象都自动具备这种通用行为，然后可根据需要赋予每个对象独特的个性。
根据类来创建对象被称为实例化（instantiation），这让你能够使用某个特定类的具体实例（instant）。
对象是类的实例，类是定义对象特性和行为的蓝图。
Python是一种支持面向对象编程的语言，具有简洁且强大的OOP特性。
"""
#用一个非常简单的例子来理解类与对象的概念和关系。
#所有的狗可能都有一些自身状态，比如说名字、年龄、颜色。
#所有的狗可能都有一些通用行为，比如说狗都会叫、狗都会打滚、狗都会长大。
#属性（attributes）：属性是类中定义的变量，用于存储对象的状态。也被称为成员变量（member variable）。
#方法（methods）：方法是类中定义的函数，用于实现对象的行为。也被称为成员函数（member function）。
class Dog:
    #__init__：这是一个特殊的方法，称为初始化方法或构造函数。当类的实例被创建时，这个方法会自动调用，用于初始化对象的属性。
    def __init__(self,name,age,color):
        self.name = name
        self.age = age
        self.color =color
    def bark(self): # 方法
        print(f"{self.name} is barking.")
    def roll_over(self):  # 方法
        print(f"{self.name} is rolling over.")
    def grow_up(self, year):  # 方法
        self.age += year
        print(f"{self.name} is {self.age} years old.")
#在定义完Dog类之后，我们这样进行两只不同的狗的实例化。
dog1 = Dog("xiaohei", 5, "black")
dog2 = Dog("dahuang", 7, "yellow")
#每一个具体对象的属性都是不同的，我们可以使用点（.）操作符来访问一只狗的属性
print(dog1.name)
print(dog2.age)
#方法的调用也是类似的，我们同样可以使用点（.）操作符，来调用方法。
dog1 = Dog("xiaohei", 5, "black")
dog1.bark()
dog1.grow_up(3)
"""
类内和类外访问属性的区别和联系
两者的区别
- 类内使用self访问和修改属性：
  - self是指向当前实例的引用。当类的方法被调用时，self允许方法访问和修改该实例的属性。
  - 例如，在类内初始化方法__init__中，self.name = name将参数name的值赋给实例属性name。
  - 例如，在类内self.grow_up()方法中，self.age += year修改了实例属性age。
- 类外使用实例名访问属性：
  - 在类外，我们使用实例名直接访问实例的属性。
  - 例如，在类外print(dog1.name)访问的是dog1实例的name属性。
  - 例如，在类外print(dog2.age)访问的是dog2实例的age属性。
两者的联系
- 访问同一属性：
  - 不论是在类内还是类外，访问的都是同一个实例的属性。
  - 类内通过self引用实例，类外直接通过实例名引用实例。
  - 例如，在类内我们用self.name访问实例的name属性，在类外用dog1.name访问同一属性。
- 对象的状态一致性：
  - 无论是在类内通过self访问还是在类外通过实例名访问，属性的值都是一致的，因为它们引用的是同一个对象的属性。 
"""